/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package de.hsos.samcomm.forumManagement.boundary.jsf;

import de.hsos.samcomm.boundary.Community;
import de.hsos.samcomm.forumManagement.controller.ForumDAO;
import de.hsos.samcomm.forumManagement.entity.Entry;
import de.hsos.samcomm.forumManagement.entity.Forum;
import de.hsos.samcomm.userManagement.entity.Member;
import de.hsos.samcomm.userManagement.boundary.jsf.LoginBean;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ManagedProperty;
import javax.faces.bean.SessionScoped;
import javax.inject.Inject;

/**
 *
 *
 * @author Dennis
 */
@ManagedBean(name = "homeBean")
@SessionScoped
public class HomeBean implements Serializable {
    @Inject
    private Community community;

    @ManagedProperty("#{loginBean}")
    private LoginBean loginBean;

    private List<Forum> myForen = new ArrayList<>();
    private List<Forum> allForen = new ArrayList<>();
    private List<Entry> actEntries = new ArrayList<>();
    private Entry actEntry = null;
    private Forum actForum = null;
    private Member actMember = null;
    private String title;
    private String text;
    private boolean checkAddEntry = false;

    /**
     * Default Konstruktor.
     */
    public HomeBean() {}

    /**
     * Einen Eintrag hinzufuegen.
     */
    public void addEntry() {
        community.createEntry(actMember, actForum, title, text);
        clear();
    }

    /**
     * Ein Forum hinzufuegen.
     */
    public void addForum() {
        community.createForum(actMember, title);
        clear();
    }

    /**
     * Den aktuellen Benutzer dem aktuellen Forum hinzufuegen.
     */
    public void addSubscriber() {
        community.subscribeMemberInForum(actMember, actForum);
        myForen = actMember.getSubscriptions();
    }

    /**
     * Liefert alle abonnierten Foren.
     *
     * @return alle abonnierten Foren
     */
    public List<Forum> getMyForen() {
        if (actMember != null) {
            myForen = actMember.getSubscriptions();
        }
        return myForen;
    }

    /**
     * Get-Methode fuer das aktuelle Forum.
     *
     * @return aktuelles Forum
     */
    public Forum getActForum() {
        return actForum;
    }

    /**
     * Get-Methode fuer den aktuellen Benutzer.
     *
     * @return aktueller Benutzer.
     */
    public Member getActMember() {
        actMember = loginBean.getActMember();
        return actMember;
    }

    /**
     * Get-Methode fuer alle Foren.
     * Filtert die bereits abonnierten Foren heraus.
     *
     * @return gefilterte Forenliste
     */
    public List<Forum> getAllForen() {
        Forum f2;
        allForen.clear();
        for (Forum f1 : community.getForen()) {
            Iterator<Forum> it = myForen.iterator();
            boolean tmp = true;
            while (tmp && it.hasNext()) {
                f2 = it.next();
                tmp = !(f2.getOID().equals(f1.getOID()));
            }
            if (tmp) {
                allForen.add(f1);
            }
        }
        return allForen;
    }

    /**
     * Get-Methode fuer die aktuellen Eintraege.
     *
     * @return aktuelle Eintraege
     */
    public List<Entry> getActEntries() {
        if (actForum != null) {
            actEntries = actForum.getEntries();
        }
        return actEntries;
    }

    /**
     * Get-Methode fuer den aktuellen Eintrag.
     *
     * @return aktueller Eintrag
     */
    public Entry getActEntry() {
        return actEntry;
    }

    /**
     * Get-Methode fuer den Titel.
     *
     * @return title
     */
    public String getTitle() {
        return title;
    }

    /**
     * Get-Methode fuer den Text.
     *
     * @return text
     */
    public String getText() {
        return text;
    }

    /**
     * Get-Methode fuer die loginBean
     *
     * @return loginBean
     */
    public LoginBean getLoginBean() {
        return loginBean;
    }

    /**
     * Get-Methode fuer checkAddEntry. Testet ob ein Eintrag hinzugefuegt werden
     * darf.
     *
     * @return true, wenn erlaubt
     */
    public boolean isCheckAddEntry() {
        checkAddEntry = actForum == null;
        return checkAddEntry;
    }

    /**
     * Set-Methode fuer die aktuellen Eintraege.
     *
     * @param actEntries
     */
    public void setActEntries(List<Entry> actEntries) {
        this.actEntries = actEntries;
        actForum = null;
    }

    /**
     * Set-Methode fuer die abonnierten Foren.
     *
     * @param myForums
     */
    public void setMyForen(List<Forum> myForums) {
        this.myForen = myForums;
    }

    /**
     * Set-Methode fuer das aktuelle Forum.
     *
     * @param aForum
     */
    public void setActForum(Forum aForum) {
        this.actForum = aForum;
    }

    /**
     * Set-Methode fuer den aktuellen Benutzer.
     *
     * @param actMember
     */
    public void setActMember(Member actMember) {
        this.actMember = actMember;
    }

    /**
     * Set-Methode fuer alle Foren.
     *
     * @param allForen
     */
    public void setAllForen(List<Forum> allForen) {
        this.allForen = allForen;
    }

    /**
     * Set-Methode fuer den aktuellen Eintrag.
     *
     * @param aEntry
     */
    public void setActEntry(Entry aEntry) {
        this.actEntry = aEntry;
    }

    /**
     * Set-Methode fuer den Titel.
     *
     * @param title
     */
    public void setTitle(String title) {
        this.title = title;
    }

    /**
     * Set-Methode fuer den Text.
     *
     * @param text
     */
    public void setText(String text) {
        this.text = text;
    }

    /**
     * Set-Methode fuer die loginBean.
     *
     * @param loginBean
     */
    public void setLoginBean(LoginBean loginBean) {
        this.loginBean = loginBean;
    }

    /**
     * Set-Methode fuer checkAddEntry.
     *
     * @param checkAddEntry
     */
    public void setCheckAddEntry(boolean checkAddEntry) {
        this.checkAddEntry = checkAddEntry;
    }

    /**
     * Setzt alle Strings zurueck.
     */
    private void clear() {
        text = "";
        title = "";
    }

    /**
     * Setzt alles zurueck. Und Logt den Benutzer aus.
     *
     * @return LOGOUT-Location
     */
    // TODO: Kann vermutlich raus.
    public String resetAll() {
        actEntries.clear();
        actEntry = null;
        actForum = null;
        actMember = null;
        allForen.clear();
        myForen.clear();
        actMember = null;
        loginBean.setActMember(null);
        clear();
        return "LOGOUT";
    }

}
